Add gtk_widget_prepend_controller
authorMatthias Clasen <mclasen@redhat.com>
Mon, 22 Jun 2020 16:47:27 +0000 (12:47 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 22 Jun 2020 16:47:27 +0000 (12:47 -0400)
Add a variant of gtk_widget_add_controller that
inserts the controller at the beginning, instead
of the end. This will be used in entry completion
to make sure the entry completion key event handling
supersedes the entry one while the popup is open.

Keep this private for now, until we determine if
it needs to be public api.

gtk/gtkwidget.c
gtk/gtkwidgetprivate.h

index 2cedb2508f55ea6c3e347543ec5172b05e965df1..61ae38f0b5e8b45658b71046844eb608d1e27232 100644 (file)
@@ -11415,6 +11415,23 @@ gtk_widget_add_controller (GtkWidget          *widget,
     gtk_list_list_model_item_added_at (priv->controller_observer, priv->controllers->len - 1);
 }
 
+void
+gtk_widget_prepend_controller (GtkWidget          *widget,
+                               GtkEventController *controller)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  GTK_EVENT_CONTROLLER_GET_CLASS (controller)->set_widget (controller, widget);
+
+  if (G_UNLIKELY (!priv->controllers))
+    priv->controllers = g_ptr_array_new ();
+
+  g_ptr_array_insert (priv->controllers, 0, controller);
+
+  if (priv->controller_observer)
+    gtk_list_list_model_item_added_at (priv->controller_observer, 0);
+}
+
 /**
  * gtk_widget_remove_controller:
  * @widget: a #GtkWidget
index e7688a65cdb3466e05cee50d4637701eccaed9bb..d281dd0f439c07eb4a91952af5b7d247d96c6cb6 100644 (file)
@@ -346,6 +346,9 @@ gboolean          gtk_widget_run_controllers               (GtkWidget
                                                             double               x,
                                                             double               y,
                                                             GtkPropagationPhase  phase);
+
+void              gtk_widget_prepend_controller            (GtkWidget             *widget,
+                                                            GtkEventController    *controller);
 void              gtk_widget_handle_crossing               (GtkWidget             *widget,
                                                             const GtkCrossingData *crossing,
                                                             double                 x,